package vip.websky.project.common.utils;

import com.xiaoleilu.hutool.util.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import vip.websky.project.common.error.CommonsRuntimeException;
import vip.websky.project.common.error.ErrorCode;
import vip.websky.project.common.error.ErrorMessage;

import java.util.ArrayList;
import java.util.List;

/**
 * 对象转化类
 *
 * @author: YangYong
 * @createAt: 2017/8/6 11:37
 */

/**
 *
 * <li>1.对象属性复制</li>
 * <li>2.对象转化,生成需要的对象</li>
 *
 */
@Slf4j
public class ObjectConvertUtils {

    /**
     * 1.对象属性复制
     *
     * @param dest 目标对象
     * @param orgi 源对象
     * @throws CommonsRuntimeException 转换异常
     */
    public static void convert(Object orgi,Object dest) {
        try {
            BeanUtil.copyProperties(orgi, dest);
            log.debug("转换之前数据:{},转换之后数据:{}", orgi, dest);
        } catch (Exception e) {
            throw new CommonsRuntimeException(ErrorCode.OBJECT_CONVERT_ERROR, ErrorMessage.OBJECT_CONVERT_ERROR);
        }
    }


    /**
     * 2.对象转化,生成需要的对象
     *
     * @param orgi   源对象
     * @param tDest 目标对象
     * @param <T>    目标对象 类型
     * @return 目标对象实体
     * @throws CommonsRuntimeException 转换异常
     */
    public static <T> T copyToDest(Object orgi, Class<T> tDest) {
        try {
            T t = tDest.newInstance();
            BeanUtil.copyProperties( orgi ,t);
            log.debug("转换之前数据:{},转换之后数据:{}", orgi, t);
            return t;
        } catch (Exception e) {
            throw new CommonsRuntimeException(ErrorCode.OBJECT_CONVERT_ERROR, ErrorMessage.OBJECT_CONVERT_ERROR);
        }
    }

    /**
     * 3.列表转换
     *
     * @param orgList 源列表
     * @param tClass  目标列表元素类型
     * @param <T>     目标列表元素类型
     * @return 目标列表
     * @throws CommonsRuntimeException  转换异常
     */
    public static <T> List<T> copyToList(List orgList, Class<T> tClass) {
        try {
            List<T> list = new ArrayList<T>();
            orgList.forEach(object -> {
                list.add(copyToDest(object, tClass));
                log.debug("转换之前数据:{},转换之后数据:{}", object, tClass);
            });
            return list;
        } catch (Exception e) {
            throw new CommonsRuntimeException(ErrorCode.OBJECT_CONVERT_ERROR, ErrorMessage.OBJECT_CONVERT_ERROR);
        }

    }

}
